home *** CD-ROM | disk | FTP | other *** search
- #! /usr/local/bin/python
-
- # Watch line printer queue(s).
- # Intended for BSD 4.3 lpq.
-
- import posix
- import sys
- import time
- import string
-
- DEF_PRINTER = 'psc'
- DEF_DELAY = 10
-
- def main():
- delay = DEF_DELAY # XXX Use getopt() later
- try:
- thisuser = posix.environ['LOGNAME']
- except:
- thisuser = posix.environ['USER']
- printers = sys.argv[1:]
- if printers:
- # Strip '-P' from printer names just in case
- # the user specified it...
- for i in range(len(printers)):
- if printers[i][:2] == '-P':
- printers[i] = printers[i][2:]
- else:
- if posix.environ.has_key('PRINTER'):
- printers = [posix.environ['PRINTER']]
- else:
- printers = [DEF_PRINTER]
- #
- clearhome = posix.popen('clear', 'r').read()
- #
- while 1:
- text = clearhome
- for name in printers:
- text = text + makestatus(name, thisuser) + '\n'
- print text
- time.sleep(delay)
-
- def makestatus(name, thisuser):
- pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r')
- lines = []
- users = {}
- aheadbytes = 0
- aheadjobs = 0
- userseen = 0
- totalbytes = 0
- totaljobs = 0
- while 1:
- line = pipe.readline()
- if not line: break
- fields = string.split(line)
- n = len(fields)
- if len(fields) >= 6 and fields[n-1] == 'bytes':
- rank = fields[0]
- user = fields[1]
- job = fields[2]
- files = fields[3:-2]
- bytes = eval(fields[n-2])
- if user == thisuser:
- userseen = 1
- elif not userseen:
- aheadbytes = aheadbytes + bytes
- aheadjobs = aheadjobs + 1
- totalbytes = totalbytes + bytes
- totaljobs = totaljobs + 1
- if users.has_key(user):
- ujobs, ubytes = users[user]
- else:
- ujobs, ubytes = 0, 0
- ujobs = ujobs + 1
- ubytes = ubytes + bytes
- users[user] = ujobs, ubytes
- else:
- if fields and fields[0] <> 'Rank':
- line = string.strip(line)
- if line == 'no entries':
- line = name + ': idle'
- elif line[-22:] == ' is ready and printing':
- line = name
- lines.append(line)
- #
- if totaljobs:
- line = `(totalbytes+1023)/1024` + ' K'
- if totaljobs <> len(users):
- line = line + ' (' + `totaljobs` + ' jobs)'
- if len(users) == 1:
- line = line + ' for ' + users.keys()[0]
- else:
- line = line + ' for ' + `len(users)` + ' users'
- if userseen:
- if aheadjobs == 0:
- line = line + ' (' + thisuser + ' first)'
- else:
- line = line + ' (' + `(aheadbytes+1023)/1024`
- line = line + ' K before ' + thisuser + ')'
- lines.append(line)
- #
- sts = pipe.close()
- if sts:
- lines.append('lpq exit status ' + `sts`)
- return string.joinfields(lines, ': ')
-
- try:
- main()
- except KeyboardInterrupt:
- pass
-